package vip.meeet.schedule;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * Seconds Minutes Hours DayofMonth Month DayofWeek Year或
 * Seconds Minutes Hours DayofMonth Month DayofWeek
 * Seconds:可出现", - * /"四个字符，有效范围为0-59的整数
 * Minutes:可出现", - * /"四个字符，有效范围为0-59的整数
 * Hours:可出现", - * /"四个字符，有效范围为0-23的整数
 * DayofMonth:可出现", - * / ? L W C"八个字符，有效范围为0-31的整数
 * Month:可出现", - * /"四个字符，有效范围为1-12的整数或JAN-DEc
 * DayofWeek:可出现", - * / ? L C #"四个字符，有效范围为1-7的整数或SUN-SAT两个范围。
 * 1表示星期天，2表示星期一， 依次类推
 * Year:可出现", - * /"四个字符，有效范围为1970-2099年
 * 
 * 每一个域都使用数字，但还可以出现如下特殊字符，它们的含义是：
 * (1)*：表示匹配该域的任意值，假如在Minutes域使用*, 即表示每分钟都会触发事件。
 * (2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值，但实际不会。
 * 因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度，不管20日到底是星期几，
 * 则只能使用如下写法： 13 13 15 20 * ?, 其中最后一位只能用？，而不能使用*，如果使用*表示不管星期几都会触发，实际上并不是这样。
 * (3)-:表示范围，例如在Minutes域使用5-20，表示从5分到20分钟每分钟触发一次
 * (4)/：表示起始时间开始触发，然后每隔固定时间触发一次，例如在Minutes域使用5/20,则意味着5分钟触发一次，
 * 而25，45等分别触发一次.
 * (5),:表示列出枚举值值。例如：在Minutes域使用5,20，则意味着在5和20分每分钟触发一次。 
 * 2017年3月29日
 *
 */

@Component
public class Task {
	
	private static final Logger logger = LoggerFactory.getLogger(Task.class);

	/**
	 * 以下的方法将以一个固定延迟时间5秒钟调用一次执行，
	 * 这个周期是以上一个调用任务的完成时间为基准，
	 * 在上一个任务完成之后，5s后再次执行：
	 */
	@Scheduled(fixedDelay = 1000)
	public void fixedDealy() { 
	    logger.info("1s fixedDelay...");
	}

	/**
	 * 如果需要以固定速率执行，只要将注解中指定的属性名称改成fixedRate即可，
	 * 以下方法将以一个固定速率5s来调用一次执行，这个周期是以上一个任务开始时间为基准，
	 * 从上一任务开始执行后5s再次调用：
	 */
	@Scheduled(fixedRate = 2000)
	public void fixedRate() { 
	    logger.info("2s fixedRate...");
	}


	
	@Scheduled(cron = "1 * * * * ?")
    public void everyMinute()
    {
        logger.info("每分钟执行任务...");
    }
	
	@Scheduled(cron = "1 0/5 * * * ?")  
    public void everyFiveMin() {  
        logger.info("每5分钟执行一次任务");  
    }

    @Scheduled(cron = "1 0,20,40 * * * ?")  
    public void everyTwentyMin() {  
        logger.info("每20分钟执行一次任务");  
    }

    @Scheduled(cron = "0 * * * * ?")  
    public void everyMin() {  
        logger.info("每一分钟执行一次任务");  
    }

    @Scheduled(cron = "0 0 * * * ?")  
    public void everyHour() {  
        logger.info("每一小时执行一次任务");  
    }

    @Scheduled(cron = "0 0 0 * * ?")  
    public void everyDay() {  
        logger.info("每一天0点执行一次任务");  
    }

    @Scheduled(cron = "0 0 0 1 * ?")  
    public void everyMonth() {  
        logger.info("每月1号0点执行一次任务");  
    }

}
